import * as bcrypt from 'bcryptjs'
import * as jwt from 'jsonwebtoken'
import { JWT_SECRET } from './constants'
const path = require('path')
const fs = require('fs');


/**
 * * 密码加密
 * @param password 
 * @returns 
 */
function encryption(password: string) {
  return bcrypt.hashSync(password, 6)
}

/**
 * * 密码校验
 * @param password 
 * @returns 
 */
function decrypt(inputPas: string, dbPas: string) {
  return bcrypt.compareSync(inputPas, dbPas)
}

/**
 * * 创建 token
 * @param password 
 * @returns 
 */
function createToken(id: number, timeout = "24h") {
  const token_info = {
    id,
    ctime: new Date().getTime(), //token创建时间戳
  };
  const token = jwt.sign(token_info, JWT_SECRET, { expiresIn: timeout }); // 生成token
  // return token;
  return token;
};

/**
 * * 判断是否为undefined
 * @param password 
 * @returns 
 */
function isEmpty(data: string | number) {
  if (data === undefined || data === '' || data === null) {
    return true
  }
}

/**
 * * 处理路径
 * @param dir 
 * @returns 
 */
function handlePath(dir: String) {
  return path.join(__dirname, './', dir)
}

/**
 * * 对图片进行去重删除和重命名
 * @param password 
 * @returns 
 */
const hanldeImgDelAndRename = (id: String, filename: String, dirPath: String) => {
  // TODO 查找该路径下的所有图片文件
  fs.readdir(dirPath, (err: Error, files: any) => {
    for (let i in files) {
      // 当前图片的名称
      const currentImgName = path.basename(files[i])
      // 图片的名称数组：[时间戳, id, 后缀]
      const imgNameArr = currentImgName.split('.')
      // TODO 先查询该id命名的文件是否存在，有则删除
      if (imgNameArr[1] === id) {
        const currentImgPath = dirPath + '/' + currentImgName
        fs.unlink(currentImgPath, (err: Error): void => { })
      }

      // TODO 根据新存入的文件名(时间戳.jpg)，找到对应文件，然后重命名为: 时间戳 + id.jpg
      if (currentImgName === filename) {
        const old_path = dirPath + '/' + currentImgName
        const new_path = dirPath + '/' + imgNameArr[0] + '.' + id + path.extname(files[i])
        // 重命名该文件，为 时间戳 + id.jpg
        fs.rename(old_path, new_path, (err: Error): void => { })
      }
    }
  })
}

/**
 * * 处理数据（将excel表头进行映射处理）
 * @param {*} cnNameToEnName 对象中的key，excel 中 姓名 的映射，例如：{姓名: '小明'} -> {name：'小明'}
 * @param {*} data 原始数据列表
 * @returns 处理好的数据列表
 */
const processData = (cnNameToEnName: any, data: any) => {
  let newData = data.map((item: any) => {
    let newItem = {}
    Object.keys(item).forEach((k) => {
      if (cnNameToEnName[k]) {
        newItem[cnNameToEnName[k]] = item[k]
      }
    })
    return newItem
  })
  return newData
}

// 检查日期格式：yyyy-mm-dd
const checkDate = (date:any) => {
  const regex = /^((?:19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/
  return regex.test(date)
}

export {
  encryption,
  decrypt,
  createToken,
  isEmpty,
  hanldeImgDelAndRename,
  handlePath,
  processData,
  checkDate
}